package modelo.geometria;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.Map;
import java.util.TreeMap;
import java.util.List;

import modelo.escenario.IElemento;
import modelo.geometria.Vector;

public class Grilla<T extends IElemento> implements Iterable<Vector>{
	protected Map<Vector, List<T>> posiciones;
	
	public Grilla(){
		posiciones = new TreeMap<Vector, List<T>>();
	}
	
	public Map<Vector, List<T>> getPosiciones() {
		return posiciones;
	}
	
	protected List<T> obtenerPosicion(Vector posicion) {
		List<T> elementos = posiciones.get(posicion);
		if (elementos == null) {
			elementos = new ArrayList<T>();
			posiciones.put(posicion,elementos);
		}
		return elementos;
	}

	
	
	/**Agrega un elemento en una posicion de la grilla */
	public void addElemento(T elemento){
		if (elemento != null) {
			List<T> elementos = obtenerPosicion(elemento.getPosicion());
			elementos.add(elemento);
		}
	}
	
	/**Retorna todos los elementos de una posicion*/
	public List<T> get(Vector posicion){
		return posiciones.get(posicion);
	}
	
	/**Elimina todos los elementos de una posicion*/
	public List<T> limpiarPosicion(Vector posicion){
		return posiciones.remove(posicion);
	}
	
	/**Elimina un elemento de la grilla*/
	public boolean removerElemento(T elemento){
		List<T> elementos = null;
		boolean eliminado = false;
		if (elemento!=null) {
			elementos = posiciones.get(elemento.getPosicion());
			if (elementos != null)
				eliminado = elementos.remove(elemento);
		}
		return eliminado;
	}

	@Override
	public Iterator<Vector> iterator() {
		return posiciones.keySet().iterator();
	}
}
